﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SouthApps.MobileHealth.SDK.DAL.DataAccess;
using SouthApps.MobileHealth.SDK.Common.Exceptions;
using SouthApps.MobileHealth.SDK.DAL.Model;
using SouthApps.MobileHealth.SDK.Common;

namespace SouthApps.MobileTasks.SDK.DAL.Repositories
{
    public class ZonasRepository : IZonasRepository
    {
        DepartamentoDao departamentoDao;
        ProvinciaDao provinciaDao;

        public ZonasRepository()
        {
            this.departamentoDao = new DepartamentoDao();
            this.provinciaDao = new ProvinciaDao();
        }

        public void AddDepartamento(Departamento departamento)
        {
            try
            {
                this.departamentoDao.AddDepartamento(departamento);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a departamento.", ex.Message);
            }
        }

        public List<Departamento> GetDepartamentosConSucursalesPrestador(int financiadorId, int provinciaId)
        {
            try
            {
                return this.departamentoDao.GetDepartamentosConSucursalesPrestador(financiadorId, provinciaId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting departamentos con sucursales prestador.", ex.Message);
            }
        }

        public List<Departamento> GetDepartamentosConEspecialidadSucursalesPrestador(int financiadorId, int provinciaId, int especialidadId)
        {
            try
            {
                return this.departamentoDao.GetDepartamentosConEspecialidadSucursalesPrestador(financiadorId, provinciaId, especialidadId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting departamentos con especialidad sucursales prestador.", ex.Message);
            }
        }

        public List<Departamento> GetDepartamentosConServicioGuardiaSucursalPrestador(int financiadorId, int provinciaId, int? servicioGuardiaId)
        {
            try
            {
                return this.departamentoDao.GetDepartamentosConGuardiasSucursalesPrestador(financiadorId, provinciaId, servicioGuardiaId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting departamentos con servicio guardia sucursal prestador.", ex.Message);
            }
        }

        public List<Departamento> GetDepartamentosConServicioEspecial(int financiadorId, int provinciaId, int servicioEspecialId)
        {
            try
            {
                return this.departamentoDao.GetDepartamentosConServicioEspecial(financiadorId, provinciaId, servicioEspecialId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting departamentos con servicio especial.", ex.Message);
            }
        }

        public List<Departamento> GetDepartamentosConCentrosAtencion(int financiadorId, int provinciaId)
        {
            try
            {
                return this.departamentoDao.GetDepartamentosConCentrosAtencion(financiadorId, provinciaId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting departamentos con centros atencion.", ex.Message);
            }
        }

        public void ModifyDepartamento(Departamento departamento)
        {
            try
            {
                this.departamentoDao.ModifyDepartamento(departamento);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while modifying a departamento.", ex.Message);
            }
        }


        public void AddProvincia(Provincia provincia)
        {
            try
            {
                this.provinciaDao.AddProvincia(provincia);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while adding a provincia.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConSucursalesPrestador(int financiadorId, int paisId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConSucursalesPrestador(financiadorId, paisId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con sucursales prestador.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConEspecialidadSucursalesPrestador(int financiadorId, int paisId, int especialidadId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConEspecialidadSucursalesPrestador(financiadorId, paisId, especialidadId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con especialidad sucursales prestador.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConGuardiasSucursalesPrestador(int financiadorId, int paisId, int? servicioGuardiaId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConGuardiasSucursalesPrestador(financiadorId, paisId, servicioGuardiaId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con guardias sucursales prestador.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConServicioGuardiaSucursalPrestador(int financiadorId, int paisId, int servicioGuardiaId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConServicioGuardia(financiadorId, paisId, servicioGuardiaId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con servicio guardia sucursal prestador.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConServicioEspecial(int financiadorId, int paisId, int servicioEspecialId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConServicioEspecial(financiadorId, paisId, servicioEspecialId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con servicio especial.", ex.Message);
            }
        }

        public List<Provincia> GetProvinciasConCentrosAtencion(int financiadorId, int paisId)
        {
            try
            {
                return this.provinciaDao.GetProvinciasConCentrosAtencion(financiadorId, paisId);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while getting provincias con centros atencion.", ex.Message);
            }
        }

        public void ModifyProvincia(Provincia provincia)
        {
            try
            {
                this.provinciaDao.ModifyProvincia(provincia);
            }
            catch (SystemException ex)
            {
                throw new DataAccessException(DataAccessErrorCode.UnknownError, "An error has ocurred while modifying a provincia.", ex.Message);
            }
        }
    }
}
